import type { IObj } from '@/interface'
/**
 * @IObj NormalObject
 * interface IObj<T = any> {
 *   [key: string]: T
 * }
 */
interface IParams {
  /**
   * // 获取某个时间
   *
   * 默认当前时间
   *
   * 可选: 时间格式字符串 | 时间戳 | 时间类型
   */
  date?: string | number | Date,
  /**
   * // 返回该时间的数据
   *
   * 默认返回所有数据
   *
   * 可选: Y M D h m s ms day time
   *
   * 年 月 日 时 分 秒 毫秒 星期 时间戳
   */
  select?: Array<string> | never
  /**
   * // 是否获取完整时间
   * 例：{ Y: 1970, M: 1, D: 1 } ==> { Y: 1970, M: 01, D: 01 }
   */
  complete?: boolean
}
export default (params?: IParams) => {
  const { date = new Date(), select = [], complete = false }: IParams = { ...params }
  const now = (typeof date) === 'string' ? new Date((date as string).replaceAll('-', '/')) : (typeof date) === 'number' ? new Date(date) : date
  const state = ['Y', 'M', 'D', 'h', 'm', 's', 'ms', 'day', 'time']
  const data: IObj<string | number | undefined> = {}
  const se = select ? select.length >= 1 : false;
  (se ? select : state).forEach((item: string) => {
    data[item] = isDate(item, now as Date)
  })
  const completeList = ['M', 'D', 'h', 'm', 's']
  if (complete) {
    completeList.forEach((key: string) => {
      const now = data[key] as number
      data[key] = now < 10 ? `0${now}` : now
    })
  }
  return data
}

function isDate(d: string, now: Date) {
  switch (d) {
    case 'Y': return now.getFullYear()
    case 'M': return now.getMonth() + 1
    case 'D': return now.getDate()
    case 'h': return now.getHours()
    case 'm': return now.getMinutes()
    case 's': return now.getSeconds()
    case 'ms': return now.getMilliseconds()
    case 'day': return now.getDay()
    case 'time': return now.getTime()
  }
}
